package com.example.skytakeoutserver.handler

import com.example.serverbase.ext.Log
import com.example.skytakeoutserver.data.response.ApiResponse
import com.fasterxml.jackson.databind.ObjectMapper
import org.springframework.boot.web.reactive.error.ErrorWebExceptionHandler
import org.springframework.http.HttpStatus
import org.springframework.http.MediaType
import org.springframework.web.bind.annotation.RestControllerAdvice
import org.springframework.web.server.ServerWebExchange
import reactor.core.publisher.Mono

/**
 * @RestControllerAdvice是Spring Boot中用于全局异常处理的一个非常有用的注解。
 * 它结合了@ControllerAdvice和@ResponseBody**的功能，
 * 允许开发者在整个应用程序中统一处理异常。这意味着，
 * 当应用程序中的控制器抛出异常时，可以有一个中央位置来处理这些异常，并以JSON格式返回响应给客户端。
 */
@RestControllerAdvice
class GlobalExceptionHandler : ErrorWebExceptionHandler {
    /**
     * 重写
     */
    override fun handle(
        exchange: ServerWebExchange,
        ex: Throwable
    ): Mono<Void?> {
        val response = exchange.response
        response.headers.contentType = MediaType.APPLICATION_JSON
        response.statusCode = HttpStatus.INTERNAL_SERVER_ERROR
        Log.error("全局异常: {}", ex.message)
        val errorResponse = ApiResponse.error<String>("Server Internal Error")

        val dataBuffer = response.bufferFactory().wrap(
            ObjectMapper()
                .writeValueAsBytes(errorResponse)
        )

        return response.writeWith(Mono.just(dataBuffer))
    }

    /**
     * 捕获业务异常，todo:
     */


}